package example2;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

//139. 单词拆分
public class LeetCode139 {
    public static void main(String[] args) {

    }
}

/**
 * 动态规划：
 * dp[i]表示前i个字符组成的子串是否能被拆分，假设位置为dp[j]为true(j在i的前面)，
 * 而且j到i这部分的子串在字典中，那么dp[i]就一定为true，所以j可以从0增长到i，
 * 那么在遍历的过程中，就可以一直校验dp[j]和j到i部分的子串，只要有一个j满足，那么dp[i]就为true
 */
class Solution139 {
    public boolean wordBreak(String s, List<String> wordDict) {
        Set<String> wordSet = new HashSet<>(wordDict);
        boolean[] dp = new boolean[s.length() + 1];
        dp[0] = true;
        for(int i=1;i<=s.length();i++){
            for(int j=0;j<i;j++){
                if(dp[j] && wordSet.contains(s.substring(j,i))){
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[s.length()];
    }
}
